<?php
/**
 * 定义 Controller_BoBase 类
 *
 */

/**
 * Controller_BoBase 是后台控制器的基类，提供一些公共方法
 *
 */
class Controller_BoBase extends FLEA_Controller_Action {
	
	
	/**
	 * 构造函数
	 *
	 * @return Controller_BoBase
	 */
	function Controller_BoBase() {
	 	
		if($_GET['action'] != 'Login'){
			 
			$this->Authorization();
		}
	 
	
	}

	/**
	 * 验证登录
	 *
	 */
	function Authorization(){
		
		/**
		 * 检查是否已经登录，如果未登录，则返回进行登录
		 */
		if($_SESSION[get_app_inf('RBACSessionKey')]['USERID']==''){
			include(BACKEND_TPL_DIR.'/login.tpl.php');
			exit;
		}
		 
	}
	/**
	 * 返回用 _setBack() 设置的 URL
	 */
	function _goBack() {
		$url = $this->_getBack();
		unset ($_SESSION['BACKURL']);
		redirect($url);
	}

	/**
	 * 设置返回点 URL，稍后可以用 _goBack() 返回
	 */
	function _setBack() {
		$_SESSION['BACKURL'] = encode_url_args($_GET);
	}

	/**
	 * 获取返回点 URL
	 *
	 * @return string
	 */
	function _getBack() {
		if (isset ($_SESSION['BACKURL'])) {
			$url = $this->rawurl($_SESSION['BACKURL']);
		} else {
			$url = $this->_url();
		}
		return $url;
	}

	function getToken(){
		 $encrypt_key = md5(((float) date("YmdHis") 
		 + rand(10000000000000000,99999999999999999)).rand(100000,999999));
		 
		 $code=base64_encode($encrypt_key);
		 
		 if($_SESSION['TOKEN']){
		 	$_SESSION['TOKEN'] = $code;
		 }
		 else {
		 	session_register('TOKEN');
		 	$_SESSION['TOKEN']=$code;
		 }
		 return $code;
	}
	function checkToken($code){
		if($_SESSION['TOKEN'] !== $code){
			return false;
		}
		return true;
	}
	
	/**
	 * 直接提供查询字符串，生成 URL 地址
	 *
	 * @param string $queryString
	 *
	 * @return string
	 */
	function rawurl($queryString) {
		if (substr($queryString, 0, 1) == '?') {
			$queryString = substr($queryString, 1);
		}
		return $_SERVER['SCRIPT_NAME'] . '?' . $queryString;
	}

	/**
	 * 上传图片
	 */
	function _uploadPic($postname,  $dir, $width = 0, $height = 0,$filename) {
		
		FLEA::loadClass('FLEA_Helper_FileUploader');
 		$uploader =& new FLEA_Helper_FileUploader(); 
 		
		// 检查上传文件是否存在
		if (!$uploader->isFileExist($postname)) {
			return array (
				false,
				''
			);
		}
		
		
		
		// 检查文件扩展名是否是允许上传的类型
		if (($width != 0) && ($height != 0)){
			$file = & $uploader->getFile($postname);
			if (!$file->check(get_app_inf('ImgFileExts'))) {
				return array (false,'不被支持的文件类型.');
			}
		}else{
			$file = & $uploader->getFile($postname);
			if (!$file->check(get_app_inf('UploadFileExts'))) {
				return array (false,'不被支持的文件类型.');
			}
		}

		//$image->crop(get_app_inf('logoMaxWidth'), get_app_inf('logoMaxHeight'));
		$path = get_app_inf('uploadDir') .DS.$dir.DS. date('/Y/m');
		
		if(!function_exists('mkdirs')){
			FLEA::loadFile('FLEA_Helper_FileSystem');
		}
		mkdirs($path);
		
		//如果没有指定要保存的文件名，系统自动生成一个随机的文件名 
		if($filename == ''){
			// 生成唯一的文件名（重复的可能性极小）
			$id = md5(time() . $file->getFilename() . $file->getSize() . $file->getTmpName());
	     	$filename = $id . '.' . strtolower($file->getExt());
		}
		else{
			$filename = $filename . '.' . strtolower($file->getExt());
		}
		if (($width != 0) && ($height != 0)) {
			load_class('GD_MyImage');
			$image = & GD_MyImage :: createFromFile($file->getTmpName(), $file->getExt());
			$image->crop2($width, $height);
			$image->saveAsPng($path . DS . $filename);
			$image->destory();
		} else {
			$file->move($path . DS . $filename);
		}
		return array (true,	$dir.'/'.date('Y/m').'/'.$filename);
	}
  
    

	
}

function printError($errors,$key) {
	
	if(is_array($errors)){
		
		$msg='<label for="'.$key.'" generated="true" class="error">'.$errors['key'].'</label>';
	}
	
	return $msg;
}

function getVar ($name) {
	return $_POST[$name]?$_POST[$name]:$_GET[$name];
}

function chnSubstr($param) {
	$str=$param['str'];
	$start=(int)$param['start'];
	$len=$param['len'];
	$strip=$param['strip'];
	$stripAll=$param['stripAll'];
	$nlbr=$param['nlbr'];
	if($stripAll){
		$str=strip_tags($str);
		$str=eregi_replace('&[a-z]+;|&#[a-z];','',$str);
	}
	elseif($strip)
	$str=strip_tags($str,'<br><a><b><i><u><p>');
 	preg_match_all("/[\\x80-\\xff]?./",$str,$arr);
 	$res= implode(array_slice($arr[0],$start,$len),"");
 	if($nlbr)
 		$res=str_replace('  ','&nbsp;&nbsp;',nl2br($res));
 	return $res;
}

/**
 * 中文字符串截取函数
 *
 * @param unknown_type $str
 * @param unknown_type $slen
 * @param unknown_type $startdd
 * @return unknown
 */
function cn_substr($str,$slen,$startdd=0){
	$restr = "";
	$c = "";
	$str_len = strlen($str);
	if($str_len < $startdd+1) return "";
	if($str_len < $startdd + $slen || $slen==0) $slen = $str_len - $startdd;
	$enddd = $startdd + $slen - 1;
	for($i=0;$i<$str_len;$i++)
	{
	if($startdd==0) $restr .= $c;
	else if($i > $startdd) $restr .= $c;
	if(ord($str[$i])>0x80){
	if($str_len>$i+1) $c = $str[$i].$str[$i+1];
	$i++;
	}
	else{ $c = $str[$i]; }
	if($i >= $enddd){
	if(strlen($restr)+strlen($c)>$slen) break;
	else{ $restr .= $c; break; }
	}
	}
	return $restr;
}


function utf8_substr($str, $limit, $h=false) { 
	if(strlen($str)<$limit):
		return $str;
	else:	
		$restr = ''; 
		for($i=0;$i< $limit-3;$i++) { 
		$restr .= ord($str[$i])>127 ? $str[$i].$str[++$i].$str[++$i] : $str[$i]; 
		} 
		return $restr.$h; 
	endif;
} 


function check($condition=false,$post=false) {  //验证的时候一定要有提交值
	foreach ($post as  $key=> $value) {
		if($condition[$key]) {
			foreach ($condition[$key] as $check) {
				switch ($check[0]) {
					case 'not_empty':  //不能为空
						if (trim($value)=="")       $wro[$key]=$check[1];
						break;
						
					case 'max_length':  //指定字符串最大长度
						if (strlen($value) > $check[2])    $wro[$key]=$check[1];
						break;
						
					case 'min_length':  //指定字符串最小长度
						if (strlen($value) < $check[2])    $wro[$key]=$check[1];
						break;		
						
					case 'biger':  //输入的值一定要大于指定的 值
						if ($value > $check[2])    $wro[$key]=$check[1];
						break;
						
					case 'length':  //输入的值一定要大于指定的 值
						if (strlen($value) != $check[2])    $wro[$key]=$check[1];
						break;
							
					case 'smaller':  //输入的值一定要小于指定的 值
						if ($value < $check[2])    $wro[$key]=$check[1];
						break;					
						
					case 'is_same':   //判断提供的两个值是否一样
						if ($post[$check[2]]!=$post[$check[3]])  $wro[$key]=$check[1];
						break;
						
					case 'check_type':  //判断值的类型
						if (!$check[2]($value))   $wro[$key]=$check[1];
						break;
						
					case 'had':  //如果给第5个参数,找不到结果就报错
						$value=trim($value);
						$had_tb=FLEA::getSingleton($check[2]);
						$had_condition=$check[3]?(array_merge(array($key=>$value),(array)$check[3])):array($key=>$value);
						$had_count=$had_tb->findCount($had_condition) ;
						
						if(($check[4] && $had_count<1) || (!$check[4] && $had_count>0))
						{
							$wro[$key]=$check[1];
						}
						break;
						
					case 'is_time':
						$pattern = '/\b\d{4}-(0?\d|1[0-2])-((3[0,1])|([0-2]?\d))\b\s?(((2[0-3])|([0,1]?\d))(:([0-5]?\d)){0,2})?/'; 
						preg_match($pattern, $value, $gettime);
							if ($gettime[0]!=$value) 
							{
								$wro[$key]=$check[1];
							}
						break;	
					
					case 'is_mail':
						$pattern = '/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/'; 
						preg_match($pattern,$value,$gettime);
							if ($gettime[0]!=$value) 
							{
								$wro[$key]=$check[1];
							}
						break;

					case 'dis_same':   //如果提交的值等于 第二个 参数就报错
						if ($value==$check[2])  $wro[$key]=$check[1];
						break;
					
					case 'upload':  //检查上传
						if ($msg = _upload($value, $check[1])) $wro[$key]=$msg;
						break;

				}
				if($wro[$key])  break;
			}
		}
	}
	$wro['#pass']=$wro?false:true;
	return $wro;
}

function _upload($files, $condition) {
	if ($files['error'] > 0) {
		switch ($files['error']) {
			case '1':
				return  '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值';
			case '2':
				return '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。 ';
			case '3':
				return '文件只有部分被上传。';
			case '4':
				return '没有文件被上传。';
			case '5':
				return '上传文件大小为0. ';
		}
	}
	foreach ($condition as $_c) {
		switch ( key($_c) ) {
			case 'max-size':  //最大尺寸
				if ($files['size'] > current($_c)) {
					$msg = $_c['msg'];
				}
				break;

			case 'min-size':  //最小尺寸
				if ($files['size'] < current($_c)) {
					$msg = $_c['msg'];
				}
				break;
				
			case 'max-width':  //最大宽度
				$getimagesize = getimagesize($files['tmp_name']);
				if ($getimagesize[0] > current($_c)) {
					$msg = $_c['msg'];
				}
				break;

			case 'min-width':  //最小宽度
				$getimagesize = getimagesize($files['tmp_name']);
				if ($getimagesize[0] < current($_c)) {
					$msg = $_c['msg'];
				}
				break;

			case 'max-height':  //最大高度
				$getimagesize = getimagesize($files['tmp_name']);
				if ($getimagesize[1] > current($_c)) {
					$msg = $_c['msg'];
				}
				break;

			case 'min-height':  //最小高度
				$getimagesize = getimagesize($files['tmp_name']);
				if ($getimagesize[1] < current($_c)) {
					$msg = $_c['msg'];
				}
				break;

			case 'type':  //图片类型
				if (!in_array($files['type'], _mime()) ) {
					$msg = $_c['msg'];
				}
				break;
		}
		if($msg)  return $msg;
	}
}

function _mime() {
	return 
		array( "image/bmp", "image/gif", "image/jpeg", "image/jpeg", "image/pjpeg", "image/png" );
}

function getImage($url,$filename="") {  //下载图片
    if(!$url) return false;

    if(!$filename) {
		$ext=strrchr(strtolower($url),".") ;
		if($ext!=".gif" && $ext!=".jpg" && $ext!=".png" && $ext!=".bmp") return false ;
		$str=explode('/', $url) ;
		$filename=$str[count($str)-1] ;
    }
    ob_start();
    readfile($url);
    $img = ob_get_contents();
    ob_end_clean();
    $fp2=@fopen($filename, "w") ;
	fwrite($fp2, $img);
    fclose($fp2) ;

    return $filename;
 }

 
 /**
 * 重定向浏览器到指定的 URL
 * 重写FLEA自带的redirect
 *
 * @param string $url 要重定向的 url
 * @param int $delay 等待多少秒以后跳转
 * @param bool $js 指示是否返回用于跳转的 JavaScript 代码
 * @param bool $jsWrapped 指示返回 JavaScript 代码时是否使用 <script> 标签进行包装
 * @param bool $return 指示是否返回生成的 JavaScript 代码
 */
function goto($url, $delay = 0, $message='',$js = false, $jsWrapped = true, $return = false)
{
    $delay = (int)$delay;
    if (!$js) {
        if (headers_sent() || $delay > 0) {
            include(BACKEND_TPL_DIR.'/message.tpl.php'); 
            exit;
        } else {
        	echo 'run here..';
            //header("Location: {$url}");
            exit;
        }
    }

    
}

?>